element-ui radio-group组件源码学习
继续看有关radio的,还剩下个radio-group,继续看下。
一、html结构
首先,radio-group是配合radio与radio-button一起使用的。
<div
class="el-radio-group"
role="radiogroup"
@keydown="handleKeydown"
>
<!-- 显示内部的el-radio或el-radio-button -->
<slot></slot>
</div>
html部分十分简单,只有个外层的div,内部的slot显示内嵌的元素等数据。
二、JS部分
首先是一个keyCode对象,这采用了Object.freeze方法冻结了方向键的keyCode值,使得改对象无法被改变。
const keyCode = Object.freeze({
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40
});
接着看对应的数据:
name
名称
componentName
组件名
inject
注入form-item
mixins
混日组件通信的方法
props
- value:当前组件的值(model)
- size:radioGroupSize使用,也是配合radio-button组件使用
- fill:背景色,配合radio-button组件使用
- textColor:文本颜色,即前景色,给radio-button组件使用
- disabled:是否禁用
computed
- _elFormItemSize():formitem大小
- radioGroupSize():radio组大小,配合给radio-button组件时使用
created
created() {
// 绑定handleChange事件
this.$on('handleChange', value => {
// 触发实例上的change事件
this.$emit('change', value);
});
}
组件创建时,绑定handleChange事件,用于触发实例上的事件。
mounted
// 选取当前group中所有的radio
const radios = this.$el.querySelectorAll('[type=radio]');
// 选取第一个radio(组件)
const firstLabel = this.$el.querySelectorAll('[role=radio]')[0];
if (![].some.call(radios, radio => radio.checked) && firstLabel) {
// 当radioGroup没有默认选项时,第一个可以被Tab键选中
firstLabel.tabIndex = 0;
}
在radio-button和radio组件中的tabIndex函数中,我们都知道,只有当前被选中的那个组件才可以被tab键选中。而此处的mounted处理了,当没有值被选中时,我们可以通过tab键选第一个组件,这样也就避免了tab键跳过次组件的问题了。
methods
- handleKeydown(e):处理键盘按钮事件,处理上下左右事件。
switch之前是用来确定当前按钮在group中的顺序index。
keyCode.LEFT和keyCode.UP都是向左侧选择,并对边界值做了判断。 keyCode.RIGHT和keyCode.DOWN是向右侧选择,不过此处有个疑问,为啥阻止冒泡和阻止默认只在其中的一个if-else中。
watch
- value
对group的model值进行了监听,当值改变时,便会向上查找ElFormItem父组件并触发el.form.change事件。 到这有关radio的就看完了。
带注释的文件地址:radio-group.vue。